// ***********************************************
// 自定义 Cypress 命令定义
// ***********************************************

declare global {
  namespace Cypress {
    interface Chainable {
      /**
       * 等待游戏加载完成
       * @example cy.waitForGameLoad()
       */
      waitForGameLoad(): Chainable<Element>
      
      /**
       * 开始新游戏
       * @example cy.startNewGame()
       */
      startNewGame(): Chainable<Element>
      
      /**
       * 选择角色
       * @param characterName - 角色名称
       * @example cy.selectCharacter('runner')
       */
      selectCharacter(characterName: string): Chainable<Element>
      
      /**
       * 模拟游戏控制输入
       * @param action - 动作类型 ('jump', 'slide', 'left', 'right')
       * @example cy.gameAction('jump')
       */
      gameAction(action: 'jump' | 'slide' | 'left' | 'right'): Chainable<Element>
      
      /**
       * 等待分数更新
       * @param expectedScore - 期望的分数
       * @example cy.waitForScore(100)
       */
      waitForScore(expectedScore: number): Chainable<Element>
      
      /**
       * 检查游戏状态
       * @param status - 游戏状态 ('menu', 'playing', 'paused', 'gameOver')
       * @example cy.checkGameStatus('playing')
       */
      checkGameStatus(status: 'menu' | 'playing' | 'paused' | 'gameOver'): Chainable<Element>
      
      /**
       * Tab 键导航
       * @example cy.get('body').tab()
       */
      tab(): Chainable<Element>
    }
  }
}

/**
 * 等待游戏加载完成
 */
Cypress.Commands.add('waitForGameLoad', () => {
  cy.get('[data-cy="game-canvas"]', { timeout: 10000 }).should('be.visible')
  cy.get('[data-cy="loading"]').should('not.exist')
})

/**
 * 开始新游戏
 */
Cypress.Commands.add('startNewGame', () => {
  cy.get('[data-cy="start-game-btn"]').click()
  cy.waitForGameLoad()
})

/**
 * 选择角色
 */
Cypress.Commands.add('selectCharacter', (characterName: string) => {
  cy.get('[data-cy="character-select"]').should('be.visible')
  cy.get(`[data-cy="character-${characterName}"]`).click()
  cy.get('[data-cy="confirm-character-btn"]').click()
})

/**
 * 模拟游戏控制输入
 */
Cypress.Commands.add('gameAction', (action: 'jump' | 'slide' | 'left' | 'right') => {
  const keyMap = {
    jump: ' ', // 空格键
    slide: '{downarrow}',
    left: '{leftarrow}',
    right: '{rightarrow}'
  }
  
  cy.get('body').type(keyMap[action])
})

/**
 * 等待分数更新
 */
Cypress.Commands.add('waitForScore', (expectedScore: number) => {
  cy.get('[data-cy="score-display"]').should('contain', expectedScore.toString())
})

/**
 * 检查游戏状态
 */
Cypress.Commands.add('checkGameStatus', (status: 'menu' | 'playing' | 'paused' | 'gameOver') => {
  cy.get(`[data-cy="game-status-${status}"]`).should('exist')
})

/**
 * Tab 键导航
 */
Cypress.Commands.add('tab', { prevSubject: 'element' }, (subject) => {
  return cy.wrap(subject).trigger('keydown', { key: 'Tab' })
})

export {}